/**
 * @Author : ChangJun
 * @Date : 2019/3/21
 * @Version : 1.0
 * @Content : 数据校验
 */
const Regexs = {
  email: (/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i), // eslint-disable-line
  code: (/^\d{6}$/), // 验证码
  number: (/^\d*$/), // 全数字
  name: (/[\u4e00-\u9fa5]{1,20}|[a-zA-Z\.\s]{1,20}/), // eslint-disable-line
  chinaName: (/^[\u4E00-\u9FA5]{2,6}$/), // 中文姓名
  phone: (/^1[3|4|5|7|8][0-9]\d{8}$/), // 通用手机号
  idcard: ''// 身份证号
}
export default {
  chkFormat (str, ftype) {
    if (!str) {
      return false
    }
    if (ftype !== 'idcard') {
      let nReg = Regexs[ftype]
      return nReg.test(str)
    } else {
      return IdCardValidate(str)
    }
  },
  trim (str) {
    return trim(str)
  }
}
// 身份证验证
let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1] // 加权因子
let ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2] // 身份证验证位值.10代表X
function IdCardValidate (idCard) {
  idCard = trim(idCard.replace(/ /g, '')) // 去掉字符串头尾空格
  if (idCard.length === 15) {
    return isValidityBrithBy15IdCard(idCard) // 进行15位身份证的验证
  } else if (idCard.length === 18) {
    let _idCard = idCard.split('') // 得到身份证数组
    if (isValidityBrithBy18IdCard(idCard) && isTrueValidateCodeBy18IdCard(_idCard)) { // 进行18位身份证的基本验证和第18位的验证
      return true
    } else {
      return false
    }
  } else {
    return false
  }
}

/**
 * 判断身份证号码为18位时最后的验证位是否正确
 * @param _idCard 身份证号码数组
 * @return
 */
function isTrueValidateCodeBy18IdCard (_idCard) {
  let sum = 0 // 声明加权求和变量
  if (_idCard[17].toLowerCase() === 'x') {
    _idCard[17] = 10 // 将最后位为x的验证码替换为10方便后续操作
  }
  for (let i = 0; i < 17; i++) {
    sum += Wi[i] * _idCard[i] // 加权求和
  }
  let valCodePosition = sum % 11 // 得到验证码所位置
  if (_idCard[17] === ValideCode[valCodePosition]) {
    return true
  } else {
    return false
  }
}

/**
 * 验证18位数身份证号码中的生日是否是有效生日
 * @param idCard 18位书身份证字符串
 * @return
 */
function isValidityBrithBy18IdCard (idCard18) {
  var year = idCard18.substring(6, 10)
  var month = idCard18.substring(10, 12)
  var day = idCard18.substring(12, 14)
  var tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
  // 这里用getFullYear()获取年份，避免千年虫问题
  if (tempDate.getFullYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
    return false
  } else {
    return true
  }
}

/**
 * 验证15位数身份证号码中的生日是否是有效生日
 * @param idCard15 15位书身份证字符串
 * @return
 */
function isValidityBrithBy15IdCard (idCard15) {
  var year = idCard15.substring(6, 8)
  var month = idCard15.substring(8, 10)
  var day = idCard15.substring(10, 12)
  var tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
  // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
  if (tempDate.getYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
    return false
  } else {
    return true
  }
}

// 去掉字符串头尾空格
function trim (str) {
  return str.replace(/(^\s*)|(\s*$)/g, '')
}
